/*
 * CommunicationRobotPiezas.cpp
 *
 *  Created on: 16/11/2013
 *      Author: gonzalo
 */

#include "CommunicationRobotPiezas.h"
#include "../common/StringUtils.h"
#include "../logger/logger.h"


const int middleware::CommunicationRobotPiezas::ROBOT_ESPERANDO_PIEZA = 1;
const int middleware::CommunicationRobotPiezas::ROBOT_ESPERANDO_CINTA = 2;
const int middleware::CommunicationRobotPiezas::ROBOT_ACTIVO = 3;
const int middleware::CommunicationRobotPiezas::ROBOT_INACTIVO = 4;

namespace middleware {

CommunicationRobotPiezas::CommunicationRobotPiezas(char key): key(key)  {
}

CommunicationRobotPiezas::~CommunicationRobotPiezas() {
}

void CommunicationRobotPiezas::despertar(EstadoRobotPiezas estadoRobot) {
	// Primero fijarse en un shmem de estado si esta dormido
	this->shMemEstado.lock();
	EstadoRobotPiezas estado = this->shMemEstado.read();
	if (estado == estadoRobot || estado == ROBOT_INACTIVO ) {
		CLogger::log(this->getNombre() + " (key: "+ this->getKey() +") se despierta.");
		estado = ROBOT_ACTIVO;
		this->shMemEstado.write(estado);
		this->semRobot.signal();
	} else {
		CLogger::log(this->getNombre() + " (key: "+ this->getKey() +") no se despierta pues estaba despierto.");
	}
	this->shMemEstado.unlock();
}

void CommunicationRobotPiezas::despertarHayPieza() {
	this->despertar(ROBOT_ESPERANDO_PIEZA);
}

void CommunicationRobotPiezas::despertarHayProductoCinta() {
	this->despertar(ROBOT_ESPERANDO_CINTA);
}

void CommunicationRobotPiezas::esperar(EstadoRobotPiezas estadoRobot) {
	this->shMemEstado.lock();
	EstadoRobotPiezas estado = estadoRobot;
	this->shMemEstado.write(estado);
	this->shMemEstado.unlock();
	CLogger::log(this->getNombre() + " (key: "+ this->getKey() +") está esperando.");
	this->semRobot.wait();
}

void CommunicationRobotPiezas::esperarPieza() {
	this->esperar(ROBOT_ESPERANDO_PIEZA);
}

void CommunicationRobotPiezas::esperarCinta() {
	this->esperar(ROBOT_ESPERANDO_CINTA);
}

char CommunicationRobotPiezas::getAltKey(char key) {
	char alt = key + 10;
	return (alt > 61 && alt < 122)? alt : 'z';
}

char CommunicationRobotPiezas::getKey() {
	return this->key;
}

}
 /* namespace middleware */
